package com.rasenhund.android.gsimulator.activity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.rasenhund.android.gsimulator.R;
import com.rasenhund.android.gsimulator.common.Const;
import com.rasenhund.android.gsimulator.schema.MobileSuit;

/**
 * 編成選択画面
 */
public class SelectSlotActivity extends BaseActivity {
    @SuppressWarnings("unused")
    private static final String TAG = SelectSlotActivity.class.getSimpleName();
    private final SelectSlotActivity self = this;

    TextView mTxtMsCost;
    TextView mTxtBaseCost;
    TextView mTxtTotalCost;

    private float mLastTouchX; // 最後にタッチされた座標
    private LayoutParams mParams = null; // Viewの余白設定

    private final int FLICK_BORDER = 5; // フリック判定のしきい値
    private final int FLICK_MOVE_MAX = 30; // フリックによる最大移動量
    
    private Handler mHandler = null; // UI操作用のハンドラ
    private View mView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_slot);

        // 機体一覧
        for (int i = 0; i < mSlotIdList.length; i++) {

            RelativeLayout slot = (RelativeLayout) findViewById(mSlotIdList[i]);
            slot.setClickable(true);
            // TODO 右フリック、左フリック用のガイド表示入れる
            slot.setOnTouchListener(slot_OnTouchListener);

            // 機体No受け渡し用にIndexを隠し項目に保存
            TextView hidRowNo = (TextView) slot.findViewById(R.id.hidRowNo);
            hidRowNo.setText(String.valueOf(i));

            // viewにアイテムをセット
            setSlot(slot, mLstMachine.get(i));

        }

        // 確定ボタン
        Button btnConfirm = (Button) findViewById(R.id.btnConfirm);
        btnConfirm.setOnClickListener(btnConfirm_OnliClickListener);

        mTxtMsCost = (TextView) findViewById(R.id.txtMsCost);
        mTxtBaseCost = (TextView) findViewById(R.id.txtBaseCost);
        mTxtTotalCost = (TextView) findViewById(R.id.txtTotalCost);
        
        // UI操作用のハンドラを生成
        mHandler = new Handler();

    }

    @Override
    protected void onResume() {
        super.onResume();

        calcTotalCost();

    }

    /********************
     * EventListener
     ********************/

    /**
     * MSスロットタッチ時のイベントリスナ
     */
    private OnTouchListener slot_OnTouchListener = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            mView = v;

            // 再設定用に余白を取得しておく
            mParams = (LayoutParams) mView.getLayoutParams();
            mParams.setMargins(0, 0, 0, 0);

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mLastTouchX = event.getX();
                    break;

                case MotionEvent.ACTION_MOVE:
                    // 指の動きに合わせて余白を調整する
                    int margin = (int) (event.getX() - mLastTouchX);
                    if (margin > FLICK_MOVE_MAX)
                        margin = FLICK_MOVE_MAX;
                    else if (margin < -FLICK_MOVE_MAX)
                        margin = -FLICK_MOVE_MAX;
                    mParams.setMargins(margin, 0, 0, 0);

                    break;

                case MotionEvent.ACTION_UP:

                    // タッチと区別する場合に閾値を設定
                    if (mLastTouchX < event.getX() - FLICK_BORDER) {
                        // 右にフリックされたときの処理

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                // コストアップ
                                setCostUp(mView);
                            }
                        });

                    } else if (mLastTouchX > event.getX() + FLICK_BORDER) {
                        // 左にフリックされたときの処理

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                // スロットのクリア
                                clearSlot(mView);
                            }
                        });

                    }else {
                        // 移動量が少ない場合はタッチとして処理する

                        // カテゴリ選択画面へ遷移
                        moveCategorySelect(v);
                    }
                    break;
            }

            // 余白の再設定
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    mView.setLayoutParams(mParams);
                }
            });

            return true;
        }
    };

    /**
     * 確定ボタン押下時のイベントリスナ
     */
    private OnClickListener btnConfirm_OnliClickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {

            // コストシミュレート画面に遷移
            Intent intent = new Intent(self, CostSimulateActivity.class);
            startActivity(intent);

        }
    };

    /********************
     * Method
     ********************/
    /**
     * 合計コストの計算、表示
     */
    private void calcTotalCost() {

        int iMsCostTotal = 0;// MSコスト合計
        int iVsCount = 0; // 対戦人数
        int iMsCost = 0; // MSコスト

        MobileSuit item = null;

        // MSコストの計算
        for (int i = 0; i < mLstMachine.size(); i++) {

            item = mLstMachine.get(i);

            if (item != null) {
                iMsCostTotal = iMsCostTotal + item.getCost();
            }

            // 総コスト計算用に件数を計算
            if (iMsCost != 0) {
                iVsCount++;
            }

        }

        // 総コストの取得
        if (iVsCount <= 4) {
            mTotalCost = 2000;
        } else {
            mTotalCost = 500 * iVsCount;
        }

        // 拠点コストの取得(総コストの25%)
        mBaseCost = (int) (mTotalCost * 0.25);

        mTxtMsCost.setText(String.valueOf(iMsCostTotal));
        mTxtBaseCost.setText(String.valueOf(mBaseCost));
        mTxtTotalCost.setText(String.valueOf(mTotalCost));

    }

    /**
     * Viewにアイテムをセット
     * 
     * @param view
     * @param item
     */
    private void setSlot(View view, MobileSuit item) {

        TextView txtCategory = (TextView) view.findViewById(R.id.txtCategory);
        TextView txtModelNo = (TextView) view.findViewById(R.id.txtModelNo);
        TextView txtMsName = (TextView) view.findViewById(R.id.txtMsName);
        TextView txtCost = (TextView) view.findViewById(R.id.txtCost);
        // TextView hidCost = (TextView) view.findViewById(R.id.hidCost);
        TextView txtArmsName = (TextView)
                view.findViewById(R.id.txtArmsName);

        switch (item.getCategoryCd()) {
            case Const.CATEGORY.GRAPP:
                txtCategory.setText(getString(R.string.category_grapp));
                txtCategory.setBackgroundResource(R.drawable.category_grapp);
                break;
            case Const.CATEGORY.SHORT:
                txtCategory.setText(getString(R.string.category_short));
                txtCategory.setBackgroundResource(R.drawable.category_short);
                break;
            case Const.CATEGORY.SHOOT:
                txtCategory.setText(getString(R.string.category_shoot));
                txtCategory.setBackgroundResource(R.drawable.category_shoot);
                break;
            case Const.CATEGORY.TANK:
                txtCategory.setText(getString(R.string.category_tank));
                txtCategory.setBackgroundResource(R.drawable.category_tank);
                break;
            case Const.CATEGORY.SNIPE:
                txtCategory.setText(getString(R.string.category_snipe));
                txtCategory.setBackgroundResource(R.drawable.category_snipe);
                break;
            default:
                txtCategory.setText("-");
                txtCategory.setBackgroundResource(R.drawable.normal);
                break;
        }

        txtModelNo.setText(item.getModelNo());
        txtMsName.setText(item.getMsName());
        txtCost.setText(String.valueOf(item.getCost()));
        // hidCost.setText(String.valueOf(item.getCost()));
        txtArmsName.setText(item.getSelectedArmName());

    }

    /**
     * スロットのクリア
     * 
     * @param v
     */
    private void clearSlot(View v) {

        if (mView == null) {
            return;
        }

        // 隠し項目から機体番号を取得
        TextView hidRowNo = (TextView) v.findViewById(R.id.hidRowNo);
        int iRowNo = Integer.valueOf(hidRowNo.getText().toString());

        // MSスロットのクリア
        MobileSuit item = new MobileSuit();
        mLstMachine.set(iRowNo, item);

        // 空データを再セット
        setSlot(v, item);

        // コスト再計算
        calcTotalCost();

    }

    /**
     * コストアップ処理
     * 
     * @param v
     */
    private void setCostUp(View v) {

        if (mView == null) {
            return;
        }

        // 隠し項目から機体番号を取得
        TextView txtRowNo = (TextView) v.findViewById(R.id.hidRowNo);
        int index = Integer.valueOf(txtRowNo.getText().toString());
        
        MobileSuit item = mLstMachine.get(index);
        if (item != null) {

            // 選択中の武装を1つ進める
            item.addNextArmsCost();
            mLstMachine.set(index, item);

            // コストの再描画のためViewへ再セット
            setSlot(v, item);

            // コスト再計算
            calcTotalCost();

        }

    }

    /**
     * カテゴリ選択画面へ遷移する
     * 
     * @param v
     */
    private void moveCategorySelect(View v) {

        // 隠し項目から機体番号を取得
        TextView txtRowNo = (TextView) v.findViewById(R.id.hidRowNo);
        mMachineNo = Integer.valueOf(txtRowNo.getText().toString());

        // カテゴリ選択画面へ遷移
        Intent intent = new Intent(self, SelectCategoryActivity.class);
        startActivity(intent);

    }

}
